iT邦幫忙

2022 iThome 鐵人賽

DAY 1
0
Software Development

離開C#新手村的最後試煉系列 第 1

試煉1 - 如何消滅 Magic strings

  • 分享至 

  • xImage
  •  

開始試煉

如何處理Magic strings

void Main()
{
    var now = DateTime.Now
    var nowDate = now.ToString("yyyy-MM-dd").Dump();
    var startDate = now.AddDays(-7).ToString("yyyy-MM-dd").Dump();
    var endDate = now.AddDays(-1).ToString("yyyy-MM-dd").Dump();
}

"yyyy-MM-dd" 就是 Magic strings
常見的修改像是

void Main()
{
    var dateformat = "yyyy-MM-dd"
    var now = DateTime.Now
    var nowDate = now.ToString(dateformat).Dump();
    var startDate = now.AddDays(-7).ToString(dateformat).Dump();
    var endDate = now.AddDays(-1).ToString(dateformat).Dump();
}

但是 一個系統之中 會用到顯示時間應該會有很多地方
每個方法內都有自己的dateformat很容易就不一致

void Main()
{
    var now = DateTime.Now;
    var nowDate = now.ToString(DateTimeFormatSetting.DateFormat).Dump();
    var startDate = now.AddDays(-7).ToString(DateTimeFormatSetting.DateFormat).Dump();
    var endDate = now.AddDays(-1).ToString(DateTimeFormatSetting.DateFormat).Dump();
}

public class DateTimeFormatSetting
{
    public static readonly string DateFormat = "yyyy/MM/dd";
    public static readonly string DateFormatWithoutYear = "MM/dd";
}

建立 DateTimeFormatSetting 物件 將相關的 Magic strings 放在一起
當有需求變更的時候 請改成 "yyyy-MM-dd" 就很好處理了

還有像是下面的範例

if(saleCount > 9){/* 某些邏輯 */}

那個 9 在開發當下 一定很熟知用法 但是過了半年一年或是其他同事來看的話
會必須要想一下吧 所以給個適合的變數名稱像是

var minDisplaySaleCount = 9;
if(saleCount > minDisplaySaleCount){/* 某些邏輯 */}

如果在很特殊的知識時 我會直接用中文 與其打一堆我後來還要翻譯的英文 還是打中文好
( 前些時候看保哥的直播討論用中文在程式碼內 發現我並不孤單 )

那 minDisplaySaleCount 會不會到處用到 就可以是看情況建立 class + static readonly 去使用

延伸試煉

Miniblog.Core 這個專案內可以看到大師是怎樣處理Magic strings
在拿取 appsettings.json 的資料時 時也用到相似的概念 更是優秀
(EX:Config.Blog.Name => "blog:name")
請務必前往觀摩大師的程式碼
https://github.com/madskristensen/Miniblog.Core/blob/master/src/Constants.cs

結束試煉

string 是很常用到感覺很簡單 但是卻又很深奧的 這次應該有不少篇幅會以string為主題
今天的試煉就到這邊 下個試煉見

程式碼都是用LINQPad 5寫的應該複製貼上就可以執行

參考
What is wrong with magic strings?


下一篇
試煉2 - appSettings 由簡單讀取到進階應用
系列文
離開C#新手村的最後試煉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言